package queue

import (
	"sync"
	"time"
)

//IQueue : 队列接口
type IQueue interface {
	Length() int
	Capacity() int
	Front() *Node
	Rear() *Node
	Enqueue(value interface{}) bool
	Dequeue() interface{}
}

//Queue : 队列描述
type Queue struct {
	QueueName  string    `json:"queue_name"`
	CreateTime time.Time `json:"-"`
	QueueRef   IQueue    `json:"-"`
}

//Queues : 支持多队列
type Queues struct {
	QueueMap sync.Map // map of queues
}

//Create : 创建Queue
func (q *Queues) Create(queue Queue) error {
	name := queue.QueueName
	if _, ok := q.QueueMap.Load(name); ok {
		return NewQueueError("the queue exists")
	}
	var sq, _ = NewSimpleQ(newQueueCap)
	queue.CreateTime = time.Now()
	queue.QueueRef = sq
	q.QueueMap.Store(name, queue)
	return nil
}

//Delete : 删除Queue
func (q *Queues) Delete(queue Queue) error {
	//这里需要检查队列的情况 ???
	name := queue.QueueName
	q.QueueMap.Delete(name)
	return nil
}

//Describe : 描述Queue
// func (q *Queues) Describe(queue Queue) *Queue {
// 	var val *Queue
// 	var ok bool
// 	name := queue.QueueName
// 	if val, ok = q.QueueMap.Load(name); !ok {
// 		return errors.New("the queue exists")
// 	}
// 	return val
// }

//GetQueueRef : 获取指定队列的指针
//param name string 队列名
func (q *Queues) GetQueueRef(name string) IQueue {
	value, ok := q.QueueMap.Load(name)
	if !ok {
		return nil
	}
	var queue = value.(Queue)
	return queue.QueueRef
}
